package com.gdust.hzx.manager.controller;

import com.gdust.hzx.manager.service.SysMenuService;
import com.gdust.hzx.manager.service.SysUserService;
import com.gdust.hzx.manager.service.ValidateCodeService;
import com.gdust.spzx.common.log.annotation.Log;
import com.gdust.spzx.common.log.enums.OperatorType;
import com.gdust.hzx.model.dto.system.LoginDto;
import com.gdust.hzx.model.entity.system.SysUser;
import com.gdust.hzx.model.vo.common.Result;
import com.gdust.hzx.model.vo.common.ResultCodeEnum;
import com.gdust.hzx.model.vo.system.LoginVo;
import com.gdust.hzx.model.vo.system.SysMenuVo;
import com.gdust.hzx.model.vo.system.ValidateCodeVo;
import com.gdust.hzx.utils.AuthContextUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * ClassName: IndexController
 * Package: com.gdust.spzx.controller
 * Description:
 *
 * @Author syun
 * @Create 2024/11/2 22:01
 * @Version 1.0
 */
@Tag(name = "用户登录")
@RestController// @RestController: 专用于restful风格的注解 = @Controller (控制器) + @ResponseBody (方法返回值为json)
@RequestMapping(value = "/admin/system/index")
public class IndexController {

    //注入用户表的service
    @Autowired
    private SysUserService sysUserService;

    //注入图片验证码的service
    @Autowired
    private ValidateCodeService validateCodeService;

    //注入菜单表的service
    @Autowired
    private SysMenuService sysMenuService;

    /**
     * 用户登录接口
     *  @RequestBody:把当前的请求报文的请求体转换为Java数据
     *  LoginDto:用户登录请求参数,包含：用户名、密码、提交验证码、验证码key
     * @param loginDto
     * @return
     */
//    @Log(title = "用户登录",businessType = 0,operatorType = OperatorType.MANAGE)
    @Operation(summary = "用户登录")
    @PostMapping("/login")
    public Result login(@RequestBody LoginDto loginDto){
        //LoginVo:登录成功响应结果实体类.包含：token和refresh_token
        LoginVo loginVo = sysUserService.login(loginDto);
        return Result.build(loginVo, ResultCodeEnum.SUCCESS);
    }

    /**
     * 生成图片验证码
     * @return
     */
    @GetMapping(value = "/generateValidateCode")
    public Result<ValidateCodeVo> generateValidateCode(){
        //自定义方法：生成图片验证码
        ValidateCodeVo validateCodeVo  = validateCodeService.generateValidateCode();
        return Result.build(validateCodeVo,ResultCodeEnum.SUCCESS);
    }

    /**
     * //获取当前登录用户信息
     *  代码优化：后端获取用户信息的接口就无需获取token，然后根据token从Redis中进行查询。可以直接从ThreadLocal中获取用户信息，然后进行返回。
     *  @RequestHeader是将请求头信息和控制器方法的形参创建映射关系
     * @param token
     * @return
     */
    @GetMapping(value = "/getUserInfo")
    public Result<SysUser> getUserInfo(@RequestHeader(name="token")String token){
        //自定义获取用户信息方法
//        SysUser sysUser = sysUserService.getUserInfo(token);
//        return Result.build(sysUser,ResultCodeEnum.SUCCESS);
        return Result.build(AuthContextUtil.get()  , ResultCodeEnum.SUCCESS) ;
    }

    /**
     * 用户退出功能
     *
     * @RequestHeader是将请求头信息和控制器方法的形参创建映射关系
     * @param token
     * @return 退出不返回值
     */
    @Log(title = "用户退出",businessType = 0,operatorType = OperatorType.MANAGE)
    @GetMapping(value = "/logout")
    public Result logout(@RequestHeader(name="token")String token){
        //自定义退出功能
        sysUserService.logout(token);

        return Result.build(null,ResultCodeEnum.SUCCESS);
    }

    /**
     * 查询用户可以操作菜单
     * 思路：不同用户其所对应的权限是不同的，因此关于左侧菜单需要根据当前登录的用户所对应的角色动态进行获取。
     * @return 业务状态码
     */
    @GetMapping("/menus")
    public Result menus(){
        //自定义方法：查询用户可操作性菜单
        List<SysMenuVo> list = sysMenuService.findMenusByUserId();
        return Result.build(list,ResultCodeEnum.SUCCESS);
    }


}
